package cn.s1995.sloth.common.core.constant.enums.hint;

/**
 * Hint
 *
 * @Author penf
 * @Description
 * @Date 2020/07/23 12:00
 * -----------------------------------------------------------
 * 将项目中的返回码定义为5位数字（00000）
 * 0-表示通用成功
 * 1-表示通用失败
 * <p>
 * 首位代表返回码级别：
 * 1-系统级错误，例如：http400, http401, http404, http500, http502
 * 2-服务级错误，例如：扫码提示非法二维码
 * 3-第三方系统错误（stripe, ceilo, paytm, razorpay, paypal, firebase, ...）
 * <p>
 * 第二位代表服务模块：
 * 0-表示通用错误，例如：手机号格式不正确、密码错误、
 * 1-表示BMS服务
 * 2-表示APP服务（如：APP,H5）
 * <p>
 * 后三位代表业务码：
 * 包括通用业务码、其他业务码
 * 000-499表示通用业务码
 * 500-999表示其他业务码（各个项目逻辑有差异不能通用的）
 * <p>
 * 栗子：
 * -----------------------------------------------------------
 * 系统级eg:
 * 10400-请求参数错误
 * 10401-无权访问
 * 10404-找不到资源
 * <p>
 * <p>
 * 服务级eg:
 * NON:
 * 20000-当前版本过低，请升级
 * 20001-重复提交
 * APP服务:
 * 21001-请填写正确的二维码编号
 * 21300-paytm绑定失败（印度特有）
 * 21500-支付卡已过期
 * BMS服务:
 * 22001-订单不存在
 * 22002-机柜编号错误
 * 22003-订单号不存在无法更改订单金额
 * <p>
 * 第三方eg:
 * stripe:
 * 30000-为创建递延帐户提供的电子邮件地址已经有一个与之关联的帐户。使用OAuth流将现有帐户连接到您的平台。
 * 30001-提供的公司地址所在的国家/地区与帐户的国家/地区不匹配。公司必须与帐户位于同一国家/地区。
 * 30002-作为Stripe-Account标头值提供的帐户ID 无效。检查您的请求是否指定了有效的帐户ID。
 * paypal:
 * 30200-xxx
 * 30201-xxx
 * 微信 ：
 * 40000
 * <p>
 * 支付宝：
 * 50000
 * 银联：
 * 60000
 */
public enum Hint implements HintEnum {

    /**
     * 通用返回码
     */
    SUCCESS(0, "成功"),
    FAILED(1, "失败"),

    /**
     * 系统级返回码
     */
    SYSTEM_MAINTENANCE(10100, "系统维护中"),
    SYSTEM_BUSY(10101, "系统正忙，请稍后再试"),
    BAD_REQUEST(10400, "客户端请求的语法错误，服务器无法理解"),
    UNAUTHORIZED(10401, "您还未登录或登录失效，请先登录" ),
    FORBIDDEN(10403, "服务器理解请求客户端的请求，但是拒绝执行此请求"),
    NOT_FOUND(10404, "服务器资源未找到"),
    METHOD_NOT_ALLOWED(10405, "客户端请求中的方法被禁止" ),
    BAD_PARAMETER(10406, "请求的参数有误"),
    INTERNAL_SERVER_ERROR(10500, "服务器内部错误" ),

    /**
     * 服务级通用返回码-NON[20xxx]
     */
    NON_APP_UPDATE(20000, "当前版本过低，请升级"),
    NON_IDEMPOTENT_INVALID(20001, "请勿重复提交" ),
    NON_TRY_AGAIN_LATER(20002, "请稍后再试" ),
    NON_ONLY_FILE(20003, "请上传正确格式的文件，如{bmp, png, tif, gif, jpg, jpeg,mp4, avi, mpg, wmv, mov, asf, asx, flv}"),
    NON_ONLY_IMAGE(20004, "请上传正确格式的图片，如{bmp, png, tif, gif, jpg, jpeg}"),
    NON_ONLY_VIDEO(20005, "请上传正确的格式的视频，如{mp4, avi, mpg, wmv, mov, asf, asx, flv}" ),

    NON_REFUND_FAILED(20007, "退款失败"),
    NON_ACCOUNT_DISABLED(20008, "账号已锁定"),
    NON_ACCOUNT_EXIST(20009, "账号已被已注册"),
    NON_ACCOUNT_NOT_EXIST(20010, "账号不存在"),
    NON_PASSWORD_ERROR(20011, "密码错误"),
    NON_PASSWORD_DIFFERENT(20012, "两次密码不一致"),
    NON_PASSWORD_FORMAT_ERROR(20013, "密码必须是8-20位数字、字母或字符中的2种组合（不能是纯数字）"),
    NON_VERIFY_CODE_ERROR(20014, "验证码错误"),
    NON_VERIFY_CODE_EXPIRED(20015, "验证码已过期"),
    NON_VERIFY_FREQUENTLY_SEND(20016, "短信发送过于频繁，请{0}s后再试"),

    NON_PAY_FAILED(20017, "支付业务异常，请稍后重试"),

    NON_PAY_CHANNEL_NOT_SUPPORT(20018, "支付渠道暂不支持"),

    NON_PAY_CLIENT_TYPE_ERROR(20019, "支付客户端类型错误"),

    NON_SMS_TYPE(20020, "短信类型不存在"),



    // BMS-返回码[21000-21999]==========================================================================================
    BMS_PROD_CATEGORY_NOT_EXISTS(21000, "分类不存在"),
    BMS_PROD_CATEGORY_EXISTS_CHILD(21001, "存在子分类不能删除"),
    BMS_PROD_CATEGORY_EXISTS_PROJECT(21002, "存在关联的项目不能删除"),
    BMS_PROD_PROP_ALREADY_EXISTS(21003, "已有相同名称规格"),
    BMS_PROD_GROUP_UNSELECTED(21004, "请选择产品分组"),
    BMS_PROD_CATEGORY_UNSELECTED(21005, "请选择产品分类"),
    BMS_PROD_DELIVERY_TYPE_UNSELECTED(21006, "请选择配送方式"),
    BMS_PROD_SKU_MUST_ENABLE_ONE(21007, "至少要启用一种产品规格"),
    BMS_PROD_ALREADY_EXISTS(21008, "存在重复的产品"),


    // APP-返回码[22000-22999]==========================================================================================
    APP_CART_CHANGE_NUM(22000, "输入更改数量"),
    APP_PROD_NOT_SALE(22001, "产品[{0}]已下架"),
    APP_PROD_STOCKS_NOT_ENOUGH(22002, "产品[{0}]库存不足"),
    APP_CART_PROD_HAS_BENN_REMOVED(22003, "购物车产品已被删除"),
    APP_PLEASE_CHOOSE_YOUR_NEED_TO_ADD_TO_THE_SHOPPING_CART(22004, "请选择您需要的产品加入购物车"),
    APP_ORDER_EXPIRED_PLEASE_RETRY(22005, "订单已过期，请重新下单"),
    APP_ORDER_PAID(22006, "订单已支付"),
    APP_BILLING_INFO_HANGED(22007, "结算信息已更改"),
    APP_USER_ADDRESS_NOT_EXIST(22008, "用户地址不存在"),
    APP_USER_ADDRESS_IS_DEFAULTED(22009, "默认地址无法删除"),
    APP_PLEASE_SELECT_THE_RECEIVING_ADDRESS(22010, "请填写收货地址"),
    APP_CONTAINS_UNRECOGNIZED_PRODUCTS(22011, "包含无法识别的产品"),
    APP_YOU_HAVE_NO_PERMISSION_TO_GET_THE_ORDER_INFORMATION(22012, "你没有权限获取该订单信息"),
    APP_THE_ORDER_HAS_NOT_BEEN_DELIVERED_YET(22013, "订单未发货，无法确认收货"),
    APP_THE_ORDER_REFUND_EXISTED(22014, "已存在退款记录"),
    APP_ORDER_NOT_EXIST(22015, "订单不存在"),
    APP_IM_ACCOUNT_CREATE_ERROR(22016, "创建IM账号失败"),
    APP_SHOPPING_ADDRESS_MAX_LIMIT(22017, "收货地址数量不能超过{0}个");



    private int code;

    private String desc;


    private Hint() {
    }

    Hint(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    @Override
    public String getName() {
        return this.name();
    }

    @Override
    public int getCode() {
        return this.code;
    }

    @Override
    public String getMsg() {
        if (this.desc != null && !this.desc.isEmpty()) {
            // if (this.code == SUCCESS.code) {
            //     return this.desc;
            // }
            // return String.format("%s(%s)", this.desc, this.code);
            return this.desc;
        }

        return "";
    }


    @Override
    public void setMsg(String msg) {
        this.desc = msg;
    }


    public static void main(String[] args) {
        System.out.println(genI18n());
    }

    /**
     * 生成国际化字符串，将生成的内容粘贴到src/main/resources/i18n/messages.properties中
     * @return
     */
    private static String genI18n() {
        StringBuilder sb = new StringBuilder();
        for (HintEnum hintEnum : Hint.values()) {
            sb.append("biz.").append(hintEnum.getName()).append("=").append(hintEnum.getMsg()).append("\n");
        }
        return sb.toString();
    }
}
